﻿namespace Smart.Utils.UI.BarcodeLib
{
    using System;
    using System.Collections;

    internal class EAN13 : BarcodeCommon, IBarcode
    {
        private string _Country_Assigning_Manufacturer_Code = "N/A";
        private Hashtable CountryCodes = new Hashtable();
        private string[] EAN_CodeA = new string[] { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011" };
        private string[] EAN_CodeB = new string[] { "0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001", "0001001", "0010111" };
        private string[] EAN_CodeC = new string[] { "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100" };
        private string[] EAN_Pattern = new string[] { "aaaaaa", "aababb", "aabbab", "aabbba", "abaabb", "abbaab", "abbbaa", "ababab", "ababba", "abbaba" };

        public EAN13(string input)
        {
            base.Raw_Data = input;
            this.CheckDigit();
        }

        private void CheckDigit()
        {
            if (base.Raw_Data.Length == 12)
            {
                int num3;
                int num = 0;
                int num2 = 0;
                for (num3 = 0; num3 <= 10; num3 += 2)
                {
                    num2 += int.Parse(base.Raw_Data.Substring(num3, 1));
                }
                for (num3 = 1; num3 <= 11; num3 += 2)
                {
                    num += int.Parse(base.Raw_Data.Substring(num3, 1)) * 3;
                }
                int num4 = num + num2;
                int num5 = num4 % 10;
                num5 = 10 - num5;
                if (num5 == 10)
                {
                    num5 = 0;
                }
                base.Raw_Data = base.Raw_Data + num5.ToString();
            }
        }

        private string Encode_EAN13()
        {
            int num;
            if ((base.Raw_Data.Length < 12) || (base.Raw_Data.Length > 13))
            {
                throw new Exception("EEAN13-1: Data length invalid. (Length must be 12 or 13)");
            }
            if (!BarcodeEdit.CheckNumericOnly(base.Raw_Data))
            {
                throw new Exception("EEAN13-2: Numeric Data Only");
            }
            char ch = base.Raw_Data[0];
            string str = this.EAN_Pattern[int.Parse(ch.ToString())];
            string str2 = "101";
            for (num = 0; num < 6; num++)
            {
                if (str[num] == 'a')
                {
                    ch = base.Raw_Data[num + 1];
                    str2 = str2 + this.EAN_CodeA[int.Parse(ch.ToString())];
                }
                if (str[num] == 'b')
                {
                    ch = base.Raw_Data[num + 1];
                    str2 = str2 + this.EAN_CodeB[int.Parse(ch.ToString())];
                }
            }
            str2 = str2 + "01010";
            num = 1;
            while (num <= 5)
            {
                ch = base.Raw_Data[num++ + 6];
                str2 = str2 + this.EAN_CodeC[int.Parse(ch.ToString())];
            }
            int index = int.Parse(base.Raw_Data[base.Raw_Data.Length - 1].ToString());
            str2 = str2 + this.EAN_CodeC[index] + "101";
            this.init_CountryCodes();
            this._Country_Assigning_Manufacturer_Code = "N/A";
            string str3 = base.Raw_Data.Substring(0, 2);
            string str4 = base.Raw_Data.Substring(0, 3);
            try
            {
                this._Country_Assigning_Manufacturer_Code = this.CountryCodes[str4].ToString();
            }
            catch
            {
                try
                {
                    this._Country_Assigning_Manufacturer_Code = this.CountryCodes[str3].ToString();
                }
                catch
                {
                    throw new Exception("EEAN13-3: Country assigning manufacturer code not found.");
                }
                return str2;
            }
            finally
            {
                this.CountryCodes.Clear();
            }
            return str2;
        }

        private void init_CountryCodes()
        {
            this.CountryCodes.Clear();
            this.CountryCodes.Add("00", "US / CANADA");
            this.CountryCodes.Add("01", "US / CANADA");
            this.CountryCodes.Add("02", "US / CANADA");
            this.CountryCodes.Add("03", "US / CANADA");
            this.CountryCodes.Add("04", "US / CANADA");
            this.CountryCodes.Add("05", "US / CANADA");
            this.CountryCodes.Add("06", "US / CANADA");
            this.CountryCodes.Add("07", "US / CANADA");
            this.CountryCodes.Add("08", "US / CANADA");
            this.CountryCodes.Add("09", "US / CANADA");
            this.CountryCodes.Add("10", "US / CANADA");
            this.CountryCodes.Add("11", "US / CANADA");
            this.CountryCodes.Add("12", "US / CANADA");
            this.CountryCodes.Add("13", "US / CANADA");
            this.CountryCodes.Add("20", "IN STORE");
            this.CountryCodes.Add("21", "IN STORE");
            this.CountryCodes.Add("22", "IN STORE");
            this.CountryCodes.Add("23", "IN STORE");
            this.CountryCodes.Add("24", "IN STORE");
            this.CountryCodes.Add("25", "IN STORE");
            this.CountryCodes.Add("26", "IN STORE");
            this.CountryCodes.Add("27", "IN STORE");
            this.CountryCodes.Add("28", "IN STORE");
            this.CountryCodes.Add("29", "IN STORE");
            this.CountryCodes.Add("30", "FRANCE");
            this.CountryCodes.Add("31", "FRANCE");
            this.CountryCodes.Add("32", "FRANCE");
            this.CountryCodes.Add("33", "FRANCE");
            this.CountryCodes.Add("34", "FRANCE");
            this.CountryCodes.Add("35", "FRANCE");
            this.CountryCodes.Add("36", "FRANCE");
            this.CountryCodes.Add("37", "FRANCE");
            this.CountryCodes.Add("40", "GERMANY");
            this.CountryCodes.Add("41", "GERMANY");
            this.CountryCodes.Add("42", "GERMANY");
            this.CountryCodes.Add("43", "GERMANY");
            this.CountryCodes.Add("44", "GERMANY");
            this.CountryCodes.Add("45", "JAPAN");
            this.CountryCodes.Add("46", "RUSSIAN FEDERATION");
            this.CountryCodes.Add("49", "JAPAN (JAN-13)");
            this.CountryCodes.Add("50", "UNITED KINGDOM");
            this.CountryCodes.Add("54", "BELGIUM / LUXEMBOURG");
            this.CountryCodes.Add("57", "DENMARK");
            this.CountryCodes.Add("64", "FINLAND");
            this.CountryCodes.Add("70", "NORWAY");
            this.CountryCodes.Add("73", "SWEDEN");
            this.CountryCodes.Add("76", "SWITZERLAND");
            this.CountryCodes.Add("80", "ITALY");
            this.CountryCodes.Add("81", "ITALY");
            this.CountryCodes.Add("82", "ITALY");
            this.CountryCodes.Add("83", "ITALY");
            this.CountryCodes.Add("84", "SPAIN");
            this.CountryCodes.Add("87", "NETHERLANDS");
            this.CountryCodes.Add("90", "AUSTRIA");
            this.CountryCodes.Add("91", "AUSTRIA");
            this.CountryCodes.Add("93", "AUSTRALIA");
            this.CountryCodes.Add("94", "NEW ZEALAND");
            this.CountryCodes.Add("99", "COUPONS");
            this.CountryCodes.Add("380", "BULGARIA");
            this.CountryCodes.Add("383", "SLOVENIJA");
            this.CountryCodes.Add("385", "CROATIA");
            this.CountryCodes.Add("387", "BOSNIA-HERZEGOVINA");
            this.CountryCodes.Add("460", "RUSSIA");
            this.CountryCodes.Add("461", "RUSSIA");
            this.CountryCodes.Add("462", "RUSSIA");
            this.CountryCodes.Add("463", "RUSSIA");
            this.CountryCodes.Add("464", "RUSSIA");
            this.CountryCodes.Add("465", "RUSSIA");
            this.CountryCodes.Add("466", "RUSSIA");
            this.CountryCodes.Add("467", "RUSSIA");
            this.CountryCodes.Add("468", "RUSSIA");
            this.CountryCodes.Add("469", "RUSSIA");
            this.CountryCodes.Add("471", "TAIWAN");
            this.CountryCodes.Add("474", "ESTONIA");
            this.CountryCodes.Add("475", "LATVIA");
            this.CountryCodes.Add("477", "LITHUANIA");
            this.CountryCodes.Add("479", "SRI LANKA");
            this.CountryCodes.Add("480", "PHILIPPINES");
            this.CountryCodes.Add("482", "UKRAINE");
            this.CountryCodes.Add("484", "MOLDOVA");
            this.CountryCodes.Add("485", "ARMENIA");
            this.CountryCodes.Add("486", "GEORGIA");
            this.CountryCodes.Add("487", "KAZAKHSTAN");
            this.CountryCodes.Add("489", "HONG KONG");
            this.CountryCodes.Add("520", "GREECE");
            this.CountryCodes.Add("528", "LEBANON");
            this.CountryCodes.Add("529", "CYPRUS");
            this.CountryCodes.Add("531", "MACEDONIA");
            this.CountryCodes.Add("535", "MALTA");
            this.CountryCodes.Add("539", "IRELAND");
            this.CountryCodes.Add("560", "PORTUGAL");
            this.CountryCodes.Add("569", "ICELAND");
            this.CountryCodes.Add("590", "POLAND");
            this.CountryCodes.Add("594", "ROMANIA");
            this.CountryCodes.Add("599", "HUNGARY");
            this.CountryCodes.Add("600", "SOUTH AFRICA");
            this.CountryCodes.Add("601", "SOUTH AFRICA");
            this.CountryCodes.Add("609", "MAURITIUS");
            this.CountryCodes.Add("611", "MOROCCO");
            this.CountryCodes.Add("613", "ALGERIA");
            this.CountryCodes.Add("619", "TUNISIA");
            this.CountryCodes.Add("622", "EGYPT");
            this.CountryCodes.Add("625", "JORDAN");
            this.CountryCodes.Add("626", "IRAN");
            this.CountryCodes.Add("627", "KUWAIT");
            this.CountryCodes.Add("628", "SAUDI ARABIA");
            this.CountryCodes.Add("629", "EMIRATES");
            this.CountryCodes.Add("690", "CHINA");
            this.CountryCodes.Add("691", "CHINA");
            this.CountryCodes.Add("692", "CHINA");
            this.CountryCodes.Add("693", "CHINA");
            this.CountryCodes.Add("694", "CHINA");
            this.CountryCodes.Add("695", "CHINA");
            this.CountryCodes.Add("729", "ISRAEL");
            this.CountryCodes.Add("740", "GUATEMALA");
            this.CountryCodes.Add("741", "EL SALVADOR");
            this.CountryCodes.Add("742", "HONDURAS");
            this.CountryCodes.Add("743", "NICARAGUA");
            this.CountryCodes.Add("744", "COSTA RICA");
            this.CountryCodes.Add("746", "DOMINICAN REPUBLIC");
            this.CountryCodes.Add("750", "MEXICO");
            this.CountryCodes.Add("759", "VENEZUELA");
            this.CountryCodes.Add("770", "COLOMBIA");
            this.CountryCodes.Add("773", "URUGUAY");
            this.CountryCodes.Add("775", "PERU");
            this.CountryCodes.Add("777", "BOLIVIA");
            this.CountryCodes.Add("779", "ARGENTINA");
            this.CountryCodes.Add("780", "CHILE");
            this.CountryCodes.Add("784", "PARAGUAY");
            this.CountryCodes.Add("785", "PERU");
            this.CountryCodes.Add("786", "ECUADOR");
            this.CountryCodes.Add("789", "BRAZIL");
            this.CountryCodes.Add("850", "CUBA");
            this.CountryCodes.Add("858", "SLOVAKIA");
            this.CountryCodes.Add("859", "CZECH REPUBLIC");
            this.CountryCodes.Add("860", "YUGLOSLAVIA");
            this.CountryCodes.Add("867", "NORTH KOREA");
            this.CountryCodes.Add("869", "TURKEY");
            this.CountryCodes.Add("880", "SOUTH KOREA");
            this.CountryCodes.Add("885", "THAILAND");
            this.CountryCodes.Add("888", "SINGAPORE");
            this.CountryCodes.Add("890", "INDIA");
            this.CountryCodes.Add("893", "VIETNAM");
            this.CountryCodes.Add("899", "INDONESIA");
            this.CountryCodes.Add("955", "MALAYSIA");
            this.CountryCodes.Add("958", "MACAU");
            this.CountryCodes.Add("977", "INTERNATIONAL STANDARD SERIAL NUMBER FOR PERIODICALS (ISSN)");
            this.CountryCodes.Add("978", "INTERNATIONAL STANDARD BOOK NUMBERING (ISBN)");
            this.CountryCodes.Add("979", "INTERNATIONAL STANDARD MUSIC NUMBER (ISMN)");
            this.CountryCodes.Add("980", "REFUND RECEIPTS");
            this.CountryCodes.Add("981", "COMMON CURRENCY COUPONS");
            this.CountryCodes.Add("982", "COMMON CURRENCY COUPONS");
        }

        public string Encoded_Value
        {
            get
            {
                return this.Encode_EAN13();
            }
        }
    }
}

